package com.yuchuang.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.yuchuang.model.User;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JWTUtil {
    //token有效时长
    private static final long EXPIRE=24 * 60*60*1000l;
    //token的密匙  可自行定义
    private static final String SECRET = "JWT";
    public static String createToken(User user){
        //token  过期时间
        Date date = new Date(System.currentTimeMillis()+EXPIRE);
        //jwt的header部分
        Map<String,Object> map = new HashMap<>();
        map.put("alg","HS256");
        map.put("typ","JWT");
        //使用jwt的api生成token
        String token = JWT.create()
                .withHeader(map)
                .withClaim("username",user.getUserNickname())//私有声明
//                .withClaim("password",user.getTelephone())//私有声明   私密数据不应该加载载荷里
                .withExpiresAt(date)//过期时间
                .withIssuedAt(new Date())//签发时间
                .sign(Algorithm.HMAC256(SECRET));
        return token;
    }

    /**
     *校验token的有效性
     *1.token的header和payload是否没改过
     * 2 没有过期
     */
    public static boolean verify(String token){
        try{
            //解密
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
            verifier.verify(token);
            return true;
        }catch (Exception e){
            return false;
        }
    }
    //无需解密也可以获取token的值
    public static String getUserNickname(String token){
        try{
            DecodedJWT jwt = JWT.decode(token);
            return jwt.getClaim("username").asString();
        }catch(Exception e){
            return null;
        }
    }
}
